{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "3659cbd7",
   "metadata": {},
   "source": [
    "训练模型、评估模型\n",
    "\n",
    "主要得到：\n",
    "\n",
    "训练好的模型、模型评估结果"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "48ceb14a",
   "metadata": {},
   "source": [
    "# 读取数据和引入模块"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "398828d7",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-06-23T03:07:36.434286Z",
     "start_time": "2022-06-23T03:07:34.970350Z"
    },
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "import sklearn as sk\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.ensemble import GradientBoostingClassifier\n",
    "from sklearn.metrics import roc_curve\n",
    "import toad"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "86342b66",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-06-23T03:07:36.498016Z",
     "start_time": "2022-06-23T03:07:36.436315Z"
    }
   },
   "outputs": [],
   "source": [
    "data_train = pd.read_csv('data_train.csv')\n",
    "data_train = data_train.iloc[:,1:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "3becc1dd",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-06-23T03:07:36.513085Z",
     "start_time": "2022-06-23T03:07:36.500018Z"
    }
   },
   "outputs": [],
   "source": [
    "X_train = data_train.drop(columns = ['loan_status'])\n",
    "y_train = data_train['loan_status']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "6a4f7f8c",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-06-23T03:07:36.529175Z",
     "start_time": "2022-06-23T03:07:36.515124Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((26313, 19), (26313,))"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train.shape,y_train.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "69652b25",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-06-23T03:07:36.544207Z",
     "start_time": "2022-06-23T03:07:36.531177Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    19016\n",
       "1     7297\n",
       "Name: loan_status, dtype: int64"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train.value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "56515105",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-06-23T03:07:36.575184Z",
     "start_time": "2022-06-23T03:07:36.546237Z"
    }
   },
   "outputs": [],
   "source": [
    "data_test = pd.read_csv('data_test.csv')\n",
    "data_test = data_test.iloc[:,1:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "09c308dc",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-06-23T03:07:36.590226Z",
     "start_time": "2022-06-23T03:07:36.576186Z"
    }
   },
   "outputs": [],
   "source": [
    "X_test = data_test.drop(columns = ['loan_status'])\n",
    "y_test = data_test['loan_status']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "bd3de2ec",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-06-23T03:07:36.606299Z",
     "start_time": "2022-06-23T03:07:36.592227Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((6579, 19), (6579,))"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_test.shape,y_test.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "0e8e3eb9",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-06-23T03:07:36.621924Z",
     "start_time": "2022-06-23T03:07:36.607378Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    4777\n",
       "1    1802\n",
       "Name: loan_status, dtype: int64"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_test.value_counts()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bb078475",
   "metadata": {},
   "source": [
    "# 模型训练"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "639e7d75",
   "metadata": {},
   "source": [
    "## 网格搜索"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "fc25f556",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-06-23T03:07:36.638030Z",
     "start_time": "2022-06-23T03:07:36.624428Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"param={'n_estimators':list(range(50, 400, 50)),'max_depth':list(range(2, 5, 1)),'learning_rate':list(np.arange(0.01, 0.5, 0.05))}\\ngridsearch=sk.model_selection.GridSearchCV(estimator=sk.ensemble.GradientBoostingClassifier(subsample=0.8,validation_fraction=0.1,n_iter_no_change=3,random_state=1),\\n                                          param_grid=param,cv=3,scoring='f1',n_jobs=-1,verbose=2)\\ngridsearch.fit(X_train,y_train)\\ngridsearch.best_params_,gridsearch.best_score_\""
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "'''param={'n_estimators':list(range(50, 400, 50)),'max_depth':list(range(2, 5, 1)),'learning_rate':list(np.arange(0.01, 0.5, 0.05))}\n",
    "gridsearch=sk.model_selection.GridSearchCV(estimator=sk.ensemble.GradientBoostingClassifier(subsample=0.8,validation_fraction=0.1,n_iter_no_change=3,random_state=1),\n",
    "                                          param_grid=param,cv=3,scoring='f1',n_jobs=-1,verbose=2)\n",
    "gridsearch.fit(X_train,y_train)\n",
    "gridsearch.best_params_,gridsearch.best_score_'''"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2524b491",
   "metadata": {},
   "source": [
    "## 训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "07aad493",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-06-23T03:07:37.096202Z",
     "start_time": "2022-06-23T03:07:36.639031Z"
    }
   },
   "outputs": [],
   "source": [
    "GBDT_model=sk.ensemble.GradientBoostingClassifier(subsample=0.8,validation_fraction=0.1,n_iter_no_change=3,random_state=1,max_depth=4,n_estimators=50,learning_rate=0.46)\n",
    "GBDT_model_fit=GBDT_model.fit(X_train,y_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0e516908",
   "metadata": {},
   "source": [
    "## 预测与评估"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b3775122",
   "metadata": {},
   "source": [
    "### 混淆矩阵"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "941b2cb5",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-06-23T03:07:37.142894Z",
     "start_time": "2022-06-23T03:07:37.098205Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>预测为好</th>\n",
       "      <th>预测为坏</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>标签为好</th>\n",
       "      <td>4459</td>\n",
       "      <td>318</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>标签为坏</th>\n",
       "      <td>1457</td>\n",
       "      <td>345</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      预测为好  预测为坏\n",
       "标签为好  4459   318\n",
       "标签为坏  1457   345"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_pred_test = GBDT_model_fit.predict(X_test)\n",
    "y_pred_train = GBDT_model_fit.predict(X_train)\n",
    "cnf_matrix = sk.metrics.confusion_matrix(y_test,y_pred_test)\n",
    "cnf_matrix = pd.DataFrame(cnf_matrix,index = [\"标签为好\",\"标签为坏\"],columns = ['预测为好','预测为坏'])\n",
    "cnf_matrix"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "84db1e13",
   "metadata": {},
   "source": [
    "### 评估指标"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "c0e656ea",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-06-23T03:07:37.174693Z",
     "start_time": "2022-06-23T03:07:37.144397Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>准确率</th>\n",
       "      <th>AUC</th>\n",
       "      <th>KS值</th>\n",
       "      <th>PSI</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.730202</td>\n",
       "      <td>0.702129</td>\n",
       "      <td>0.295707</td>\n",
       "      <td>0.000067</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        准确率       AUC       KS值       PSI\n",
       "0  0.730202  0.702129  0.295707  0.000067"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "accuracy=sk.metrics.accuracy_score(y_test,y_pred_test)\n",
    "y_score=GBDT_model_fit.predict_proba(X_test)[:,1]\n",
    "auc=sk.metrics.roc_auc_score(y_test,y_score)\n",
    "fpr,tpr,threshold=sk.metrics.roc_curve(y_test,y_score)\n",
    "ks=max([trp_ - fpr_ for trp_, fpr_ in zip(tpr, fpr)])\n",
    "psi=toad.metrics.PSI(y_pred_train,y_pred_test)\n",
    "estimate=pd.DataFrame([[accuracy,auc,ks,psi]],columns=['准确率','AUC','KS值','PSI'])\n",
    "estimate"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "bad5a1c2",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-06-23T03:07:37.349294Z",
     "start_time": "2022-06-23T03:07:37.176214Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "y_proba = GBDT_model_fit.predict_proba(X_test)\n",
    "fig,(axe1,axe2) = plt.subplots(1,2,sharey = True)\n",
    "for i in range(len(np.unique(y_test))):\n",
    "    fpr,tpr,thresholds = roc_curve(y_test,y_proba[:,i],pos_label = i)\n",
    "axe1.plot(fpr,tpr)\n",
    "axe1.plot([0,1],[0,1])\n",
    "axe1.set_title('ROC')\n",
    "axe2.plot(1 - thresholds,tpr,label = 'TPR')\n",
    "axe2.plot(1 - thresholds,fpr,label = 'FPR')\n",
    "plt.xlim(0,)\n",
    "axe2.set_title('KS')\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "12739d2c",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
